在USB example里面文件:

img

lite为精简版,省略了很多USB枝干上的功能,保留了USB通讯部分的主干功能,我使用的是全功能版。

img

函数 BOARD_InitPins()中,主要是PORT以及GPIO相关的初始化。

img

  1. 使能PORT的时钟,当外设时钟没有打开时,程序不能读出外设寄存器的值,同时也不能使用外设。
  2. 通过PORT设置GPIO引脚功能,此处为设置LPUART功能。芯片手册P115。
  3. 将键盘涉及到的GPIO引脚统统都设为GPIO引脚(自己定义的函数)。
  4. 进行UART相关配置。
  5. 将USB 键盘对应的相关引脚都设置为输入引脚。

BOARD_BootClockRUN(),设置芯片时钟为48MHZ,总线时钟为24MHZ。

BOARD_InitDebugConsole(),主要是初始化UART相关的配置,例入波特率等等。

USB_DeviceApplicationInit(),这个函数很重要,应用初始化,这里的设置关乎于后面程序的成功与否,不过这里是KSDK已经实现了的,我们仅仅是需要做一下了解即可。

使能USB工作时钟。

img

这段代码是由宏定义给包裹起来的,根据注释可以粗略判断出,主要是针对KHCI USB中的RAM特定的,将RAM里面的数据全部清0。

img

对composite结构体进行简单的初始化。

img

USB_DeviceClassInit,这个函数比较重要,在上一个步骤中被初始化的g_UsbDeviceComposite.deviceHandle,将被在这个函数中重新赋予新的含义,里面设计到很多函数指针,推荐使用source insight可以看得清楚些。

另外,我这里将Mouse的相关函数给屏蔽掉了,因为我需要实现的是Keyboard。

img

USB_DeviceClassInit

img

configList也就是g_UsbDeviceCompositeConfigList

img

img

可以看到USB_DeviceHidKeyboardCallback显然是个很重要的主,我们进去look look。

img

从这个函数里面又会碰到另一个很重要的函数,USB_DeviceHidKeyboardAction(),这个函数里面也就是KSDK中需要我们自己写的用户处理操作函数。

img

这个案例默认键盘是不断发出PAGEUP和PAGEDOWN键值,这里只是演示,所以若是要实现真正的产品,那是必须要把这段代码注释掉,来从新写一段新的功能函数代码的。